util 模块是一个工具模块,提供了一些常用的辅助函数。

下面将逐介绍一下常用的方法。

1 常用方法

1.1 对象转字符串

util.inspect(object, [options]),常与 console.log 搭配使用,可以友好的将对象转为字符串,打印更加友好。

下面是一个用于测试的对象。

js // 复杂对象 const testObj = { a: 1, b: { c: 2, d: [3, 4, 5], e: () => { console.log(6) } }, f: '7', g: [{ 8: [{ 9: 10 }] }], h() { console.log(11) } }

首先是普通打印,可以看到嵌套的数组和函数没有办法打印出来,

js console.log(testObj)

然后是通过 JSON.stringify

js console.log(JSON.stringify(testObj, null, 2))

可以看到函数没有了,

最后是 util.inspect,其中 depth 用于控制展开的层级。

js console.log(util.inspect(testObj, { depth: Math.Infinity }))

可以看到深层的数组和对象被展开了。

当然实际开发中可以使用 javascript-stringify 这个库,来实现更佳完整友好的转换。

```sh

安装依赖

npm i javascript-stringify ```

运行结果如下。

```js import { stringify } from 'javascript-stringify'

console.log(stringify(testObj, null, 2)) ```

能保持和传入的结果基本一致。

1.2 格式化字符串

util.format(format[, ...args]) 类似于 C 语言中的使用 printf 方法的传参,

该方法支持占位符 (%s、%d、%j 等) 来表示不同类型的变量,支持传入多个参数。

```js import util from 'util'

console.log(util.format('%s:%s', 'foo', 'bar')) // 'foo:bar' console.log(util.format('%d + %d = %d', 1, 2, 3)) // '1 + 2 = 3'

console.log( util.format('My name is %j', { firstName: 'John', lastName: 'Doe' }) ) // 'My name is {"firstName":"John","lastName":"Doe"}' ```

1.3 promise 转回调

util.callbackify 可以将一个返回 promise 的函数转为回调形式的函数。

```js import util from 'util'

function foo() { return Promise.resolve('hello world') }

function bar() { return Promise.reject(new Error('error reject')) }

const callbackFoo = util.callbackify(foo) const callbackBar = util.callbackify(bar)

callbackFoo((err, ret) => { if (err) { console.log('err', err) return } console.log(ret) })

callbackBar((err, ret) => { if (err) { console.log('err', err) return } console.log(ret) }) ```

1.4 回调转 promise

util.promisify(original) 用于将常规带有回调函数的方法转为返回 Promise 对象的方法。

fs.readFile 举例。

js // 引入 Node.js 内置模块 util 和 fs import util from 'util' import fs from 'fs' // 将 fs.readFile 方法转换为返回 Promise 的函数 const fsRead = util.promisify(fs.readFile) // 使用 Promise 的方式读取文件内容并输出 fsRead('./package.json').then((data) => { console.log(data.toString()) })

1.5 判断数据类型

当然这些方法编辑器会显示已经弃用 (deprecated,即表示有其它可替代的方法了),当然也不妨碍了解一下

```js import util from 'util'

// 判断数据类型 console.log(util.isArray([])) // true console.log(util.isRegExp(/some regexp/)) // true console.log(util.isDate(new Date())) // true console.log(util.isPrimitive(null)) // true console.log(util.isPrimitive(1)) // true ```

小结

本节介绍了 util 模块的常用方法,包括,

对象转字符串 (inspect)、格式化字符串 (format)、promise 转回调 (callbackify)、回调转 promise (promisify)、判断数据类型等方法。

熟练利用这些方法,可以避免自己重复书写同样的工具方法,提高编码效率。